/*!
 * \file WtSimpDataMgr.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 简单数据管理器定义
 * 
 * \details 本文件定义了WonderTrader执行监控系统的简单数据管理器类WtSimpDataMgr，
 *          负责执行监控系统的数据存储、缓存和管理功能。
 *          
 *          主要功能包括：
 *          - 实时行情数据缓存和管理
 *          - K线数据的存储和查询
 *          - 数据读取器的集成和管理
 *          - 时间信息的维护和提供
 *          - 基础数据服务的代理
 *          
 *          该类是执行监控系统中数据层的核心组件，为执行器提供必要的数据支持。
 */
#pragma once
#include <vector>
#include "../Includes/IDataReader.h"
#include "../Includes/IDataManager.h"

#include "../Includes/WTSCollection.hpp"

class WtExecRunner;

NS_WTP_BEGIN
class WTSVariant;
class WTSHisTickData;
class WTSKlineData;
class WTSTickData;
class WTSKlineSlice;
class WTSTickSlice;
class IBaseDataMgr;
class IBaseDataMgr;
class WTSSessionInfo;

/*!
 * \class WtSimpDataMgr
 * \brief 简单数据管理器
 * 
 * \details WtSimpDataMgr是执行监控系统的简单数据管理器，实现了IDataReaderSink
 *          和IDataManager接口，负责数据的存储、缓存和查询功能。
 *          
 *          主要职责包括：
 *          - 管理实时tick数据的缓存
 *          - 提供K线数据和tick数据的查询服务
 *          - 集成数据读取器，支持历史数据访问
 *          - 维护当前时间信息（日期、时间、交易日等）
 *          - 代理基础数据管理器和热点管理器的服务
 *          - 处理行情数据推送和更新
 *          
 *          该类采用简化的设计，专门为执行监控场景优化，
 *          相比完整的数据管理器，具有更轻量级的特点。
 *          
 * \note 该类主要用于执行监控系统，不适用于复杂的策略回测场景
 * \see IDataReaderSink, IDataManager
 */
class WtSimpDataMgr : public IDataReaderSink, public IDataManager
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化简单数据管理器，设置初始状态。
	 *          所有指针成员初始化为NULL，缓存映射初始化为空。
	 */
	WtSimpDataMgr();
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 释放分配的资源，包括实时tick数据缓存映射。
	 */
	~WtSimpDataMgr();

private:
	/*!
	 * \brief 初始化数据存储
	 * 
	 * \details 根据配置信息初始化数据读取器，建立与数据存储系统的连接。
	 *          支持加载不同类型的数据读取器动态库。
	 * 
	 * \param cfg 数据存储配置信息
	 * \return 初始化是否成功
	 * 
	 * \note 数据读取器必须实现标准的IDataReader接口
	 */
	bool	initStore(WTSVariant* cfg);

public:
	/*!
	 * \brief 初始化数据管理器
	 * 
	 * \details 初始化简单数据管理器，设置执行运行器引用和数据存储配置。
	 * 
	 * \param cfg 配置信息，包含数据存储相关配置
	 * \param runner 执行运行器指针，用于获取基础数据服务
	 * \return 初始化是否成功
	 */
	bool	init(WTSVariant* cfg, WtExecRunner* runner);

	/*!
	 * \brief 处理行情数据推送
	 * 
	 * \details 处理实时行情数据推送，更新tick数据缓存，
	 *          维护当前时间信息（日期、时间、交易日等）。
	 * 
	 * \param stdCode 标准合约代码
	 * \param newTick 新的tick数据指针
	 * 
	 * \note 该函数会自动维护时间信息的一致性
	 */
	void	handle_push_quote(const char* stdCode, WTSTickData* newTick);

	//////////////////////////////////////////////////////////////////////////
	//IDataManager接口实现
	
	/*!
	 * \brief 获取tick数据切片
	 * 
	 * \details 获取指定合约的历史tick数据切片，用于技术分析和策略计算。
	 * 
	 * \param code 合约代码
	 * \param count 数据条数
	 * \param etime 结束时间，0表示最新时间
	 * \return tick数据切片指针，失败时返回NULL
	 * 
	 * \note 返回的数据需要调用者负责释放
	 */
	WTSTickSlice* get_tick_slice(const char* code, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取K线数据切片
	 * 
	 * \details 获取指定合约和周期的K线数据切片，支持多种K线周期和倍数。
	 * 
	 * \param code 合约代码
	 * \param period K线周期（分钟、小时、日线等）
	 * \param times 周期倍数（如5分钟线的times为5）
	 * \param count 数据条数
	 * \param etime 结束时间，0表示最新时间
	 * \return K线数据切片指针，失败时返回NULL
	 * 
	 * \note 返回的数据需要调用者负责释放
	 */
	WTSKlineSlice* get_kline_slice(const char* code, WTSKlinePeriod period, uint32_t times, uint32_t count, uint64_t etime = 0) override;
	
	/*!
	 * \brief 获取最新tick数据
	 * 
	 * \details 获取指定合约的最新tick数据，从实时数据缓存中获取。
	 * 
	 * \param code 合约代码
	 * \return 最新tick数据指针，未找到时返回NULL
	 * 
	 * \note 返回的数据已经增加引用计数，调用者需要负责释放
	 */
	WTSTickData* grab_last_tick(const char* code) override;

	//////////////////////////////////////////////////////////////////////////
	//IDataStoreListener接口实现
	
	/*!
	 * \brief K线数据更新回调
	 * 
	 * \details 当数据读取器有新的K线数据时的回调函数。
	 *          在简单数据管理器中，该函数为空实现。
	 * 
	 * \param code 合约代码
	 * \param period K线周期
	 * \param newBar 新的K线数据
	 */
	virtual void	on_bar(const char* code, WTSKlinePeriod period, WTSBarStruct* newBar) override;
	
	/*!
	 * \brief 所有K线数据更新完成回调
	 * 
	 * \details 当数据读取器完成一轮K线数据更新时的回调函数。
	 *          在简单数据管理器中，该函数为空实现。
	 * 
	 * \param updateTime 更新时间
	 */
	virtual void	on_all_bar_updated(uint32_t updateTime) override;

	/*!
	 * \brief 获取基础数据管理器
	 * 
	 * \details 获取基础数据管理器的指针，代理执行运行器的基础数据服务。
	 * 
	 * \return 基础数据管理器指针
	 */
	virtual IBaseDataMgr* get_basedata_mgr() override;
	
	/*!
	 * \brief 获取热点管理器
	 * 
	 * \details 获取热点管理器的指针，代理执行运行器的热点合约服务。
	 * 
	 * \return 热点管理器指针
	 */
	virtual IHotMgr*	get_hot_mgr() override;
	
	/*!
	 * \brief 获取当前日期
	 * 
	 * \details 获取当前的日期信息。
	 * 
	 * \return 当前日期（格式：yyyyMMdd）
	 */
	virtual uint32_t	get_date() override;
	
	/*!
	 * \brief 获取当前分钟时间
	 * 
	 * \details 获取当前的分钟时间信息。
	 * 
	 * \return 当前分钟时间（格式：hhmm）
	 */
	virtual uint32_t	get_min_time()override;
	
	/*!
	 * \brief 获取当前秒数
	 * 
	 * \details 获取当前的秒数信息。
	 * 
	 * \return 当前秒数（格式：ssmmm，秒+毫秒）
	 */
	virtual uint32_t	get_secs() override;

	/*!
	 * \brief 数据读取器日志回调
	 * 
	 * \details 数据读取器的日志回调函数，将日志消息转发给系统日志。
	 * 
	 * \param ll 日志级别
	 * \param message 日志消息
	 */
	virtual void		reader_log(WTSLogLevel ll, const char* message) override;

	/*!
	 * \brief 获取数据读取器
	 * 
	 * \details 获取数据读取器的指针，用于直接访问数据读取功能。
	 * 
	 * \return 数据读取器指针
	 */
	inline IDataReader* reader() { return _reader; }

	/*!
	 * \brief 获取原始时间
	 * 
	 * \details 获取当前的原始时间信息。
	 * 
	 * \return 原始时间（格式：hhmm）
	 */
	inline uint32_t	get_raw_time() const { return _cur_raw_time; }
	
	/*!
	 * \brief 获取交易日
	 * 
	 * \details 获取当前的交易日期。
	 * 
	 * \return 交易日期（格式：yyyyMMdd）
	 */
	inline uint32_t	get_trading_day() const { return _cur_tdate; }

private:
	IDataReader*	_reader;		/*!< 数据读取器指针 */
	WtExecRunner*	_runner;		/*!< 执行运行器指针 */
	WTSSessionInfo*	_s_info;		/*!< 交易时段信息指针 */

	typedef WTSHashMap<std::string> DataCacheMap;
	DataCacheMap* _bars_cache;		/*!< K线缓存映射 */
	DataCacheMap* _rt_tick_map;		/*!< 实时tick数据映射 */

	uint32_t		_cur_date;		/*!< 当前日期，格式：yyyyMMdd */
	uint32_t		_cur_act_time;	/*!< 当前动作时间，格式：hhmmssmmm */
	uint32_t		_cur_raw_time;	/*!< 当前原始时间，格式：hhmm */
	uint32_t		_cur_min_time;	/*!< 当前1分钟时间，格式：hhmm */
	uint32_t		_cur_secs;		/*!< 当前秒数，格式：ssmmm */
	uint32_t		_cur_tdate;		/*!< 当前交易日，格式：yyyyMMdd */

};

NS_WTP_END
